﻿#ifndef CALCULATOR_H
#define CALCULATOR_H


#include <iostream>
#include <vector>
#include <string>
#include <functional>
#include <algorithm>
using namespace std;

#define elementType int
class Calculator
{
private:
    vector <vector<elementType>> calcTable;    //运算表
    function<elementType(elementType, elementType)> operation;
    int e_num;
    vector<elementType> elements;
    elementType identityElement;
    elementType zeroElement;

    //性质属性
    bool existIdentityElement;          //存在幺元
    bool existZeroElement;                //存在零元
    bool existInverseElement;           //存在逆元
    bool associative;                           //满足结合律
    bool closed;                                  //满足封闭性
    bool commutative;                      //满足交换律

    bool Semigroup;                         //是半群
    bool Monoid;                             //是独异点
    bool Group;                             //是群
    bool AbelGroup;                     //是阿贝尔群
    bool Cyclic;                          //是循环群


public:
    function<elementType(elementType, elementType)> getOperation();  //返回操作函数
    vector <vector<elementType>> getCalcTable();                                        //获取运算表
    vector<elementType> getElements();      //获取元素集合
    int getElementsSize();                              //获取元素个数
    Calculator();
    void calcOperations(const vector<elementType>& elements);
    void cleanData();                                          //清空元素
    void setData(const string& data);               //设置元素
    void setOperation(const string& expr);   //设置运算表达式
    void calcProperties();                                  //计算集合属性

    bool containsElement(elementType ele);  //判断是否含有某元素
    bool judgeClosed();                     //判断是否封闭
    bool judgeAssociative();                //判断是否满足结合律
    bool judgeCommutative();               //判断是否满足交换律
    bool judgeIdentityElement();           //判断是否存在幺元
    bool judgeZeroElement();               //判断是否存在零元
    bool judgeInverseElement();            //判断是否存在逆元


    bool isSemigroup();                    //判断是否是半群;
    bool isMonoid();                       //判断是否是独异点;
    bool isGroup();                         //判断是否是群;
    bool isAbelGroup();                    //判断是否是阿贝尔群
    bool isCyclic();                       //判断是否是循环群


    int calculateOrder(elementType element);//计算特定元素的阶

    void printOrder();                          //打印函数;


};

#endif // CALCULATOR_H
